import numpy as np

# ---- run Test
num: int = 0


def runTest(fun):
    global num
    print('----------------------', num)
    fun()
    num += 1
    print()


# -------------------------------------------- tests:

def test_and():
    a = np.array([[1, 2, 3], [4, 5, 6]])
    a = 10
    b = 25
    print("a的二进制数:", bin(a))
    print("b的二进制数:", bin(b))
    print(f"将 {a} 与 {b} 执行按位与操作:", np.bitwise_and(a, b))

    c = -b
    print(bin(a), '\t', bin(c))
    print(f"将 {a} 与 {c} 执行按位与操作:", np.bitwise_and(a, c))
    print(bin(np.bitwise_and(a, c)))


def test_or():
    a, b = 13, 17
    print('{a_} 和 {b} 的二进制数：')
    print(bin(a), bin(b))
    print(f'{a} 和 {b} 的位或：', np.bitwise_or(a, b))

    c = -b
    print(f'{a} 和 {c} 的位或：', np.bitwise_or(a, c))


def test_invert():
    # 数据类型为无符号整型uint8
    arr = np.array([20], dtype=np.uint8)
    print("二进制表示: ", np.binary_repr(20, 8))
    print(np.invert(arr))
    # 进行取反操作
    print("二进制表示: ", np.binary_repr(235, 8))


def test_left_shift():
    # 移动三位后的输出值
    print(np.left_shift(20, 3))
    # 打印移动后20的二进制数
    print(np.binary_repr(20, width=8))
    # 函数返回值的二进制数
    print(np.binary_repr(160, width=8))


def test_right_shift():
    # 将40右移两位后返回值：
    print(np.right_shift(40, 2))
    # 移动后40的二进制数：
    print(np.binary_repr(40, width=8))
    # 移动后返回值的二进制数：
    print(np.binary_repr(10, width=8))


# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    runTest(test_and)
    runTest(test_or)
    runTest(test_invert)
    runTest(test_left_shift)
    runTest(test_right_shift)
